Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Tipos de datos en OpenCV (página 2)




Enviado por Pablo Turmero



Partes: 1, 2

Monografias.com
Acceso a un píxel de una imagen
El acceso a píxeles concretos es posible, aunque es preferible usar funciones ya implementadas sobre imágenes (que nos evitan tener que acceder a los píxeles).
Acceso al píxel (x, y) de una imagen img:
Directamente usando imageData y widthStep:
1 canal, 8U: img->imageData[x+y*img->widthStep]
3 canales, 8U: img->imageData[x*3+y*img->widthStep], img->imageData[x*3+y*img->widthStep+1],
img->imageData[x*3+y*img->widthStep+2]
Usando las funciones cvGet2D, cvSet2D (preferible):
CvScalar cvGet2D (IplImage* img, int y, int x)
void cvSet2D (IplImage* arr, int y, int x, CvScalar valor)

Monografias.com
Entrada/salida de imágenes a disco
Las funciones para la entrada/salida de imágenes se encuentran en la librería , de OpenCV.
Leer una imagen de un fichero:
IplImage* cvLoadImage (const char* name, int iscolor=1)
name: nombre del fichero a leer.
iscolor: número de canales en la imagen resultante:
>0 : la imagen resultante tendrá siempre 3 canales (RGB)
=0 : la imagen tendrá 1 canal (escala de grises)
<0 : el número de canales depende del propio fichero
Formatos admitidos: BMP, DIB, JPEG, PNG, PBM, PGM, PPM, RAS, TIFF. En HighGUI2 se añade GIF.
Si no se puede leer el fichero, devuelve NULL.

Monografias.com
Entrada/salida de imágenes a disco
Guardar una imagen en un fichero:
int cvSaveImage (const char* name, const IplImage* image)
name: nombre del fichero a escribir.
image: imagen a guardar.
Formatos admitidos: BMP, DIB, JPEG, PNG, PBM, PGM, PPM, RAS, TIFF. En Highgui2 se añade GIF.
Devuelve 0 si no se puede escribir.
Guardar una imagen JPEG seleccionando el nivel de calidad/compresión:
int param[2]= {CV_IMWRITE_JPEG_QUALITY, valor};
cvSaveImage(“nombre.jpg”, img, param);
valor = 0 ? máxima compresión; valor = 100 ? máxima calidad

Monografias.com
Salida de imágenes por pantalla
La librería ofrece también una forma sencilla de visualizar las imágenes. Permite crear ventanas, que son referenciadas mediante cadenas de texto.
Crear una ventana:
int cvNamedWindow (const char* name, unsigned long flags)
name: nombre de la ventana a crear.
flags: 0 = se puede modificar el tamaño de la ventana; 1 = no se puede modificar el tamaño.

Destruir una ventana:
int cvDestroyWindow (const char* name)
name: nombre de la ventana a destruir.

Monografias.com
Salida de imágenes por pantalla
Mostrar una imagen en una ventana:
void cvShowImage (const char* name, const IplImage* image)
name: nombre de la ventana a usar.
image: imagen a mostrar.
Cambiar el tamaño de una ventana:
void cvResizeWindow (const char* name, int width, int height)
name: nombre de la ventana a redimensionar.
Esperar pulsación de una tecla:
int cvWaitKey (int delay= 0)
delay: tiempo máximo de espera, en milisegundos. Si es menor o igual que 0, espera indefinidamente.
Devuelve el código de la tecla, o -1 si no se pulsó ninguna.

Monografias.com
TODAS las imágenes creadas deben ser liberadas.
Liberar una imagen:
void cvReleaseImage (IplImage** image)
image: imagen a liberar, ojo es un doble puntero.
Si *image es NULL no hace nada.
Clonar una imagen:
IplImage* cvCloneImage (const IplImage* image)
image: imagen a clonar, se devuelve una copia exacta
Otras operaciones (consultar en la documentación):
cvSet: inicializar una imagen con un valor constante.
cvSplit, cvMerge: separar los canales de una imagen, y componer varios canales en una imagen, respectivamente.
cvConvertScale: convertir una imagen, cambiando los valores de profundidad de píxel.

Monografias.com
Los tipos CvMat, CvMatND y CvArr
Además de imágenes, OpenCV permite manejar también matrices (CvMat) y arrays n-dimensionales (CvMatND).
Crear una matriz o array: cvCreateMat, cvCreateMatND
Distintos valores de profundidad y número de canales
Liberar una matriz: cvReleaseMat, cvReleaseMatND
Leer un elemento: cvGet1D, cvGet2D, cvGet3D, cvGetND
Escribir un elemento: cvSet1D, cvSet2D, cvSet3D, cvSetND

Normalmente no usaremos estos tipos, pero muchas funciones sobre imágenes los admiten también.
El tipo CvArr se usa para indicar que una función puede manejar tanto un IplImage, como un CvMat o un CvMatND.

Monografias.com
Algunas cuestiones adicionales
En la mayoría de las funciones de OpenCV, tenemos que crear previamente las imágenes (no lo hace la función).
Modo in-place: si una función lo admite, significa que la imagen resultante puede ser la misma que la de entrada.
Ejemplo: cvAdd (imagenA, imagenB, imagenA);
Regiones de Interés (ROI): una imagen puede tener definida una región de interés rectangular. Las operaciones se aplican sólo sobre la región de interés.
Establecer y quitar una región de interés:
void cvSetImageROI (IplImage* image, CvRect rect)
void cvResetImageROI (IplImage* image)
Conceptos relacionados son: canal de interés (COI) y máscara (mask, imagen booleana; 0: no usar; ?0: sí usar).

Monografias.com
Ejemplo 1. Leer una imagen y mostrarla en una ventana.

IplImage *img;
cvNamedWindow("Imagen", 0); // Ventana modificable
img= cvLoadImage(“fichero.jpg", 1); // ¿Y si ponemos un 0?
cvShowImage("Imagen", img);
cvWaitKey(0);
cvDestroyWindow("Imagen");
cvReleaseImage(&img);

Monografias.com
Ejemplo 2. Leer una imagen en color, separar los canales R, G y B, y guardarlos en 3 ficheros distintos.

IplImage *img= cvLoadImage("fichero.bmp", 1);
cvNamedWindow("Imagen", 0);
cvShowImage("Imagen", img);
IplImage *canales[3];
char *nombres[3]= {"canalB.jpg", "canalG.jpg", "canalR.jpg"};
int i;
for (i= 0; i<3; i++)
canales[i]= cvCreateImage(cvGetSize(img), img->depth, 1);
cvSplit(img, canales[0], canales[1], canales[2], NULL);
for (i= 0; i<3; i++) {
cvNamedWindow(nombres[i], 0);
cvShowImage(nombres[i], canales[i]);
cvSaveImage(nombres[i], canales[i]);
cvReleaseImage(&canales[i]);
}
cvReleaseImage(&img);

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter